<?php
    namespace Core\ORM\Attributs;

    /**
     * Un Attribut est un TypePrimitif géré par l'ORM
     *
     * @author mpetrini
     */
    abstract class Attribut {
        /**
        * @var string $nom
        */
        protected $nom;
        /**
        * @var boolean $primary
        */
        protected $primary;
        /**
        * @var string $type
        */
        protected $type;
        /**
        * @var int $taille
        */
        protected $taille;
        /**
        * @var string $defaut
        */
        protected $defaut;
        /**
        * @var string $interclassement
        */
        protected $interclassement;
        /**
        * @var string $attributs
        */
        protected $attributs;
        /**
        * @var boolean $null
        */
        protected $null;
        /**
        * @var \Core\ORM\Index\Index $index
        */
        protected $index;
        /**
        * @var string $commentaires
        */
        protected $commentaires;
        /**
        * @var boolean $autoIncrement
        */
        protected $autoIncrement;
        
        /**
        * Constructeur complet
        * 
        * @param string $nom
        * @param boolean $primary (optional) (default=false)
        * @param int $taille 
        * 
        * @return void
        */
        public function __construct($nom, $primary=false, $taille=null, $autoIncrement=false) {
            $this->nom=$nom;
            $this->primary=$primary;
            $this->taille=$taille;
            $this->autoIncrement=$autoIncrement;
        }
        /**
        * Permet de récupérer le nom de cet Attribut dans la Classe
        * 
        * @return string
        */
        public function getNomAttribut() {
            return $this->nom;
        }
        /**
        * Permet le formalisme d'une valeur
        *
        * @param mixed
        * 
        * @return mixed 
        */
        public function getValeur($valeur) {
            return $valeur;
        }
        /**
        * Retourne la chaine qui permet de déclarer 
        *
        * @return string
        */
        public function getChaineDeclaration() {
            return "new ".get_class($this)."(\"".$this->nom."\", ".var_export($this->primary, true).", ".$this->taille.", ".var_export($this->autoIncrement, true).")";
        }
        /**
        * Retourne le Getter de cet Attribut
        * 
        * @return string
        */
        public function creationGetter() {
            return  "\t\t/**\n".
                    "\t\t* Getter de l'attribut ".$this->getNomAttribut()."\n".
                    "\t\t*\n".
                    "\t\t* @return ".$this->getTypeDocumente()."\n".
                    "\t\t*/\n".
                    "\t\tpublic function get".\Utils\Outils::toCamelCase($this->getNomAttribut(), true)."() {\n".
                    "\t\t\treturn \$this->".$this->getNomAttribut().";\n".
                    "\t\t}\n";
        }
        /**
        * Retourne le Setter de cet Attribut
        * 
        * @return string
        */
        public function creationSetter() {
            return  "\t\t/**\n".
                    "\t\t* Setter de l'attribut ".$this->getNomAttribut()."\n".
                    "\t\t*\n".
                    "\t\t* @param ".$this->getTypeDocumente()." \$".$this->getNomAttribut().
                    "\t\t*\n".
                    "\t\t* @return void\n".
                    "\t\t*/\n".
                    "\t\tpublic function set".\Utils\Outils::toCamelCase($this->getNomAttribut(), true)."(\$".$this->getNomAttribut().") {\n".
                    "\t\t\t\$this->".$this->getNomAttribut()."=\$".$this->getNomAttribut().";\n".
                    "\t\t}\n";
        }
        /**
        * Récupère les informations nécessaires pour créer une déclaration dans une reqûete de création de table
        * 
        * @return array 
        */
        protected function getAttributDeclarationCreateTable() {
            if($this->null) {
                $null = "NULL";
            }
            else {
                $null = "NOT NULL";
            }
            if(!empty($this->commentaires)) {
                $commentaires = "COMMENT '".addslashes($this->commentaires)."'";
            }
            else {
                $commentaires = "";
            }
            if(!empty($this->defaut)) {
                $defaut = "DEFAULT ".$this->defaut;
            }
            else {
                $defaut = "";
            }
            if($this->autoIncrement) {
                $autoIncrement = "AUTO_INCREMENT";
            }
            else {
                $autoIncrement = "";
            }
            return array("defaut" => $defaut, "commentaires" => $commentaires, "null" => $null, "autoIncrement" => $autoIncrement);
        }
        /**
        * Crée la ligne de déclaration dans une reqûete de BDD
        * 
        * @return string
        */
        public function creationDeclarationCreateTable() {
            $attributs = $this->getAttributDeclarationCreateTable();
            return $this->nom." ".strtoupper($this->type)."(".$this->taille.") ".$attributs["null"]." ".$attributs["defaut"]." ".$attributs["commentaires"];
        }
        /**
        * Retourne un ID d'une table
        *
        * @return \Core\ORM\Attributs\Integer
        */
        public static function getDefautId() {
            return new Integer('id', true, 11, true);
        }
        
        abstract public function getTypeDocumente();
        
        //GETTERS ET SETTERS
        public function getNull() {return $this->null;}
        public function setNull($null) {$this->null=(boolean)intval($null);}
        public function getNom() {return $this->nom;}
        public function setNom($nom) {$this->nom=$nom;}
        public function getType() {return $this->type;}
        public function setType($type) {$this->type=$type;}
        public function getTaille() {return $this->taille;}
        public function setTaille($taille) {$this->taille=$taille;}
        public function getPrimary() {return $this->primary;}
        public function setPrimary($primary) {$this->primary=$primary;}
    }
?>
